package javathread;

public class ThreadMethodTest {
    public static class MyThread extends Thread{
        @Override
        public void run() {
            for(int i=0;i<10;i++){
                System.out.println(i+"线程名字："+Thread.currentThread().getName()+"线程优先级"+Thread.currentThread().getPriority());
            }
        }
    }

    /**
     * 线程优先级是一个int数字，1-10，最低1，最高10,5是默认的平常优先级
     * 高优先级线程抢占低优先级线程执行权，但是只是从概率上讲，不是必定比低优先级线程先执行
     * 每个线程拥有独立的栈，程序计数器
     * 多个线程共享堆，方法区
     * 线程是程序内部的一条执行路径
     * Thread的start（）有两个作用，1.启动线程，2.调用run方法
     *
     * 线程通信
     * wait，notify，notifyall，这三个方法没有定义在Thread中，他们是Object类的方法
     *
     * java中线程分为用户线程，和守护线程，垃圾回收线程就是典型的守护线程，守护线程依赖于用户线程
     *
     * wait() 与 notify() 和 notifyAll()
     *  wait()：令当前线程挂起并放弃CPU、同步资源并等待，使别的线程可访问并修改共享资源，而当
     * 前线程排队等候其他线程调用notify()或notifyAll()方法唤醒，唤醒后等待重新获得对监视器的所有
     * 权后才能继续执行。
     *  notify()：唤醒正在排队等待同步资源的线程中优先级最高者结束等待
     *  notifyAll ()：唤醒正在排队等待资源的所有线程结束等待.
     *  这三个方法只有在synchronized方法或synchronized代码块中才能使用，否则会报
     * java.lang.IllegalMonitorStateException异常。
     *  因为这三个方法必须有锁对象调用，而任意对象都可以作为synchronized的同步锁，
     * 因此这三个方法只能在Object类中声明。
     */
    public static void main(String[] args) {
        new Thread(){
            @Override
            public void run() {
                for(int i=0;i<10;i++){
                    if (i%2==0) {
                        System.out.println(i + "线程名字：" + Thread.currentThread().getName() + "线程优先级" + Thread.currentThread().getPriority());
                    }else{
                            System.out.println(i + "线程名字：" + Thread.currentThread().getName() + "线程优先级" + Thread.currentThread().getPriority());
                    }

                }
            }
        }.start();

       MyThread myThread=new MyThread();
       myThread.setPriority(Thread.MAX_PRIORITY);
       myThread.start();
        for(int i=0;i<10;i++){
            System.out.println(i+"线程名字："+Thread.currentThread().getName()+"线程优先级"+Thread.currentThread().getPriority());
        }
    }

}
